package gestores;

import ferramentas.Seguranca;
import java.io.IOException;
import java.util.Hashtable;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import sistema.Utilizador;

public class GestorUtilizadores extends HttpServlet {

    /**
     * Processes requests for both HTTP <code>GET</code> and <code>POST</code> methods.
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    protected void processRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        HttpSession session = request.getSession();
        String accao = request.getParameter("accao");

        if (accao.equals(GestorUtilizadores.INSERIR_UTILIZADOR)) {
            try {
                inserirUtilizador(request, response, session);
            } catch (Exception e) {
                e.printStackTrace();
            }
        } else if (accao.equals(GestorUtilizadores.ALTERAR_UTILIZADOR)) {
            try {
                alterarUtilizador(request, response, session);
            } catch (Exception ex) {
                Logger.getLogger(GestorUtilizadores.class.getName()).log(Level.SEVERE, null, ex);
            }
        } else if (accao.equals(GestorUtilizadores.VISUALIZAR_UTILIZADOR)) {
            //meter a funcar!!!!!!!!!!!
            //visualizarUtilizador(request, response, session);
        }
    }

    // <editor-fold defaultstate="collapsed" desc="HttpServlet methods. Click on the + sign on the left to edit the code.">
    /**
     * Handles the HTTP <code>GET</code> method.
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        processRequest(request, response);
    }

    /**
     * Handles the HTTP <code>POST</code> method.
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        processRequest(request, response);
    }

    /**
     * Returns a short description of the servlet.
     * @return a String containing servlet description
     */
    @Override
    public String getServletInfo() {
        return "Short description";
    }// </editor-fold>

    public void inserirUtilizador(HttpServletRequest request, HttpServletResponse response, HttpSession session) throws IOException {
        // ver SE é necessario ir outra vez validar os campos dos dados, pq talvez s devia fazer na camada do layout
        //agora ta só a validaçao de dados repetidos verifica se ja existe o email
        if (dadosValidos(request)) {
            //cria um novo utilizador na bd
            Hashtable<String, String> dados_pessoais = criaTabelaUtilizador(request);
            try {
                Utilizador.insere(dados_pessoais);
                session.setAttribute("excepcao", "YEAH");
            } catch (Exception ex) {
                //enviar informaçao para o utilizador que ocorreu um erro a inserir na bd, e modificar os dados introduzidos
                System.out.println("Ocorreu um erro no... GestorUtilizadores Inserir Utilizador!");
                session.setAttribute("excepcao", ex.toString());
                response.sendRedirect("/Projecto_PR/mostra_erro.jsp");
            }
            response.sendRedirect("/Projecto_PR/mostra_sucesso.jsp");
        } else {
            // dar erros pq os dados nao estao validos
            // e voltar a pagina de registo
            //test
            session.setAttribute("excepcao", "ja existe email");
            response.sendRedirect("/Projecto_PR/mostra_erro.jsp");
        }

    }

    public void alterarUtilizador(HttpServletRequest request, HttpServletResponse response, HttpSession session) throws IOException {
        if (request.getParameter("accao").equals("primeira")) {
            Long id = (Long) session.getAttribute("id_utilizador");
            Utilizador u = null;
            try {
                u = Utilizador.devolvePorId(id);
            } catch (Exception ex) {
                //mandar algum erro
                response.sendRedirect("/Projecto_PR/mostra_erro.jsp");
                ex.printStackTrace();
            }

            session.setAttribute("nome", u.getNome());
            session.setAttribute("apelido", u.getApelido());
            session.setAttribute("data_nasc", u.getDataNascimento());
            session.setAttribute("morada", u.getMorada());
            session.setAttribute("localidade", u.getLocalidade());
            session.setAttribute("prefixo", u.getCodPostal().substring(0, 4));
            session.setAttribute("sufixo", u.getCodPostal().substring(5, 8));
            session.setAttribute("telefone", u.getTelefone());

            response.sendRedirect("/altera_registo.jsp");
        } else if (request.getParameter("accao").equals("segunda")) {

            //apos ter os layouts tentar perceber se temos as subaccoes como no RHPLUS
            Hashtable<String, String> dados = new Hashtable<String, String>();
            dados.put("var_nome", request.getParameter("nome"));
            dados.put("var_apelido", request.getParameter("apelido"));
            dados.put("var_dataNasc", request.getParameter("dataNascimento"));
            dados.put("var_morada", request.getParameter("morada"));
            dados.put("var_localidade", request.getParameter("localidade"));
            dados.put("var_codigoPostal", request.getParameter("prefixo") + "-" + request.getParameter("sufixo"));
            dados.put("var_telefone", request.getParameter("telefone"));
            dados.put("var_bi", "bi");
            dados.put("var_idutilizador", request.getParameter("id_utilizador"));
            try {
                Utilizador.altera(dados);
            } catch (Exception ex) { // mandar tmb erro na session e fazer devido reencaminhamento
                response.sendRedirect("/Projecto_PR/mostra_erro.jsp");
                ex.printStackTrace();
            }
            response.sendRedirect("/Projecto_PR/mostra_sucesso.jsp");
        }
    }

    public void fazerDeposito(HttpServletRequest request, HttpServletResponse response, HttpSession session) throws IOException {
        if (request.getParameter("accao").equals("deposito")) {
            // ver se da cana por causa do valor ser double e tou a meter string
            Hashtable<String, String> dados_deposito = new Hashtable<String, String>();
            dados_deposito.put("var_valor", request.getParameter("valor"));
            dados_deposito.put("var_tipo", "deposito");
            dados_deposito.put("var_data", request.getParameter("valor"));
            dados_deposito.put("var_idutilizador", (String) session.getAttribute("id_utilizador"));
            try {
                Utilizador.insereTransaccao(dados_deposito);

                Double saldo = Utilizador.devolveSaldo((Long) session.getAttribute("id_utilizador"));
                Double total = saldo + Double.parseDouble(request.getParameter("valor"));

                Utilizador.actualizaSaldo(total);
            } catch (Exception ex) {
                //DEVOLVE ERRO AO UTILIZADOR pq nao doi possivel meter deposito e actualizar o saldo
                response.sendRedirect("/Projecto_PR/mostra_erro.jsp");
            }

            response.sendRedirect("/Projecto_PR/mostra_sucesso.jsp");

        } else {
            //ERRO!!!!!!!!!!! pq nao tem accao associada
            IllegalArgumentException illegal_argument_exception = new IllegalArgumentException();
            session.setAttribute("excepcao", illegal_argument_exception.toString());
            response.sendRedirect("/Projecto_PR/mostra_erro.jsp");
        }
    }

    public void fazerLevantamento(HttpServletRequest request, HttpServletResponse response, HttpSession session) throws IOException {
        if (request.getParameter("accao").equals("levantamento")) {
            Hashtable<String, String> dados_levantamnt = new Hashtable<String, String>();
            dados_levantamnt.put("var_valor", request.getParameter("valor"));
            dados_levantamnt.put("var_tipo", "levantamento");
            dados_levantamnt.put("var_data", request.getParameter("valor"));
            dados_levantamnt.put("var_idutilizador", (String) session.getAttribute("id_utilizador"));
            try {
                Double saldo = Utilizador.devolveSaldo((Long) session.getAttribute("id_utilizador"));
                Double valor_alevantar = Double.parseDouble(request.getParameter("valor"));
                if (saldo >= valor_alevantar) {
                    Utilizador.insereTransaccao(dados_levantamnt);

                    Double total = saldo - valor_alevantar;

                    Utilizador.actualizaSaldo(total);
                }else{
                    //DEVOLVE ERRO AO UTILIZADOR pq o saldo para a operção é insuficiente
                    response.sendRedirect("/Projecto_PR/mostra_erro.jsp");
                }
            } catch (Exception ex) {
                //DEVOLVE ERRO AO UTILIZADOR pq nao foi possivel meter levantamento devido a um erro de BD
                response.sendRedirect("/Projecto_PR/mostra_erro.jsp");
            }
            response.sendRedirect("/Projecto_PR/mostra_sucesso.jsp");
        } else {
            //ERRO!!!!!!!!!!! pq nao tem accao associada
            IllegalArgumentException illegal_argument_exception = new IllegalArgumentException();
            session.setAttribute("excepcao", illegal_argument_exception.toString());
            response.sendRedirect("/Projecto_PR/mostra_erro.jsp");
        }
    }

    public Hashtable criaTabelaUtilizador(HttpServletRequest request) {
        Hashtable<String, String> dados = new Hashtable<String, String>();
        dados.put("var_nome", request.getParameter("nome").trim());
        dados.put("var_apelido", request.getParameter("apelido").trim());
        dados.put("var_dataNasc", request.getParameter("dataNasc").trim());
        dados.put("var_morada", request.getParameter("morada").trim());
        dados.put("var_localidade", request.getParameter("localidade").trim());
        dados.put("var_codigoPostal", request.getParameter("prefixo").trim() + "-" + request.getParameter("sufixo").trim());
        dados.put("var_telefone", request.getParameter("telefone").trim());
        dados.put("var_email", request.getParameter("email").trim());
        dados.put("var_password", Seguranca.converteParaMD5(request.getParameter("password").trim()));
        dados.put("var_perfil", "utilizador");
        dados.put("var_bi", "bi");
        return dados;
    }

    //verifica se ja existe o email
    private boolean dadosValidos(HttpServletRequest request) {
        try {
            return !Utilizador.existeEmail(request.getParameter("email"));
        } catch (Exception ex) {// ver se isto poderá ser assim
            ex.printStackTrace();
            return false;
        }
    }
    public static final String INSERIR_UTILIZADOR = "inserir_utilizador";
    public static final String ALTERAR_UTILIZADOR = "alterar_utilizador";
    public static final String VISUALIZAR_UTILIZADOR = "visualizar_utilizador";
}
